/*global module:false*/
module.exports = function (grunt) {
    // LiveReload的默认端口号，你也可以改成你想要的端口号
    var lrPort = 9090;
    // 使用connect-livereload模块，生成一个与LiveReload脚本
    // <script src="http://127.0.0.1:35729/livereload.js?snipver=1" type="text/javascript"></script>
    var lrSnippet = require('connect-livereload')({port: lrPort});
    var serveStatic = require('serve-static');
    // 使用 middleware(中间件)，就必须关闭 LiveReload 的浏览器插件
    var lrMiddleware = function (connect, options) {
        return [
            // 把脚本，注入到静态文件中
            lrSnippet,
            // 静态文件服务器的路径
            serveStatic(options.base[0]),
            // 启用目录浏览(相当于IIS中的目录浏览)
            serveStatic(options.base[0])
        ];
    };
    // Project configuration.
    grunt.initConfig({
        // Metadata.
        pkg: grunt.file.readJSON('package.json'),
        banner: '<%= pkg.name %>-v<%= pkg.version %>-' + '<%= grunt.template.today("yyyy-mm-dd") %>',
        // Task configuration.
        // 清除构建文件夹
        clean: {
            beforebuild: {
                files: [{
                    src: ['dist']
                }]
            },
            afterbuild: {
                files: [{
                    src: ['.tmp']
                }]
            }
        },
        copy: {
            html: {
                files: [
                    {expand: true, cwd: 'src', src: ['**.html', 'html/**/*html'], dest: 'dist'}
                ]
            }
        },
        // 通过connect任务，创建一个静态服务器
        connect: {
            server: {
                options: {
                    // 服务器端口号
                    port: 8082,
                    // 服务器地址(可以使用主机名localhost，也能使用IP)
                    hostname: 'localhost',
                    // 物理路径(默认为. 即根目录) 注：使用'.'或'..'为路径的时，可能会返回403 Forbidden. 此时将该值改为相对路径 如：/grunt/reloard。
                    base: ['src/'],
                    open: {target: 'http://localhost:8082', appName: 'chrome'}
                },
                livereload: {
                    options: {
                        // 通过LiveReload脚本，让页面重新加载。
                        middleware: lrMiddleware
                    }
                }
            },
            build: {
                options: {
                    // 服务器端口号
                    port: 8083,
                    // 服务器地址(可以使用主机名localhost，也能使用IP)
                    hostname: 'localhost',
                    // 物理路径(默认为. 即根目录) 注：使用'.'或'..'为路径的时，可能会返回403 Forbidden. 此时将该值改为相对路径 如：/grunt/reloard。
                    base: ['dist/'],
                    open: {target: 'http://localhost:8083', appName: 'chrome'}
                },
                livereload: {
                    options: {
                        // 通过LiveReload脚本，让页面重新加载。
                        middleware: lrMiddleware
                    }
                }
            },

        },
        // 通过watch任务，来监听文件是否有更改
        watch: {
            client: {
                // 我们不需要配置额外的任务，watch任务已经内建LiveReload浏览器刷新的代码片段。
                options: {
                    livereload: true,
                    reload: true
                },
                // '**' 表示包含所有的子目录
                // '*' 表示包含所有的文件
                files: ['src/**/*.html', 'src/**/*.css', 'src/**/*.js', 'src/**/images/**']
            }
        },
        /*合并文件*/
        concat: {
            options: {
                banner: '/*' + '<%= banner %>' + '*/\n',
                stripBanners: true
            },
            cssConcat: {   // 合并css
                src: ['src/css/!(lib)/*.css'],
                dest: 'dist/css/app' + '.css'
            },
            cssLib: {
                src: ['src/css/lib/*.css'],
                dest: 'dist/css/lib' + '.css'
            },
            jsConcat: {    // 合并js
                src: 'src/js/!(lib)/*.js',
                dest: 'dist/js/app' + '.js'
            },
            jsLib: {
                src: 'src/js/lib/*.js',
                dest: 'dist/js/lib' + '.js'
            }
        },
        uglify: {   // 压缩js
            target: {//target这是任务名，可以随意取，但是不要与cssmin冲突
                files: [{
                    expand: true,//占位符（即*号）都要扩展成具体的文件
                    cwd: 'dist',//相对路径
                    src: ['**/*.js'],//相对路径下的要压缩的文件,可以使用通配符
                    dest: 'dist',//要压缩文件放入的目标路径
                    ext: '.js' //压缩后的文件后缀
                }]
            }
        },
        //压缩css
        cssmin: {
            target: {//target这是任务名，可以随意取，但是不要与cssmin冲突
                files: [{
                    expand: true,//占位符（即*号）都要扩展成具体的文件
                    cwd: 'dist',//相对路径
                    src: ['**/*.css'],//相对路径下的要压缩的文件,可以使用通配符
                    dest: 'dist',//要压缩文件放入的目标路径
                    ext: '.css' //压缩后的文件后缀
                }]
            }
        },
        imagemin: {
            /* 压缩图片大小 */
            dist: {
                options: {
                    optimizationLevel: 7, // 图片优化等级
                    pngquant: true
                },
                files: [
                    {
                        expand: true,
                        cwd: 'src',
                        src: ['**/*.{png,jpg,jpeg,gif}'], // 优化 img 目录下所有 png/jpg/jpeg 图片
                        dest: 'dist' // 优化后的图片保存位置，覆盖旧图片，并且不作提示
                    }
                ]
            }
        },
        /*rev: {
            options: {
                algorithm: 'md5',//加密方式，默认md5
                length: 8//默认长度 8
            },
            images_fonts: {
                files: {
                    src: ['dist/!**!/!*.{jpg,jpeg,gif,png,ico}']
                }
            },
            css_js: {
                files: {
                    src: ['dist/!**!/!*.{js,css}']
                }
            }
        },*/
        filerev: {
            dist: {
                options: {
                    algorithm: 'md5',
                    length: 8
                },
                src: [
                    'dist/js/{,*!/}*.js',
                    'dist/css/{,*!/}*.css',
                    'dist/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
                ]
            }
        },
        useminPrepare: {
            html: 'dist/**.html',
            options: {
                // dest: 'dist',
                flow: {
                    steps: {
                        js: ['concat', 'uglify', 'filerev']
                    },
                    post: {}

                }
                /*flow: {
                    html: {
                        steps: {
                            js: ['concat', 'uglifyjs'],
                            css: ['cssmin']
                        },
                        post: {}
                    }
                }*/
            }
        },

// Performs rewrites based on filerev and the useminPrepare configuration
        usemin: {
            css: ['dist/**/*.css'],
            html: ['dist/*.html', 'dist/html/**/*.html'],
            js: ['*.js'],
            options: {
                assetsDirs: ['images', 'dist', 'dist/**', 'dist/js/**', 'dist/css/**', 'dist/html/**', 'dist/html/persion/**', 'dist/plugs/**'],
                patterns: {
                    /*css: [
                        [/(\/images\/[\/w-]\.jpg)/, 'Replacing reference to css']
                    ],*/
                    js: [
                        [/(\/images\/[\/w-]\.jpg)/, 'Replacing reference to js']
                    ]
                },

            }
            /*css: ['dist/css/{,*!/}*.css'],
            options: {
                assetsDirs: ['dist','dist/images', 'dist/js', 'dist/css']
            }*/
        },


        //压缩HTML
        htmlmin: {
            options: {
                removeComments: true, //移除注释
                removeCommentsFromCDATA: true,//移除来自字符数据的注释
                collapseWhitespace: true,//无用空格
                collapseBooleanAttributes: true,//失败的布尔属性
                removeAttributeQuotes: true,//移除属性引号      有些属性不可移走引号
                removeRedundantAttributes: true,//移除多余的属性
                useShortDoctype: true,//使用短的跟元素
                removeEmptyAttributes: true,//移除空的属性
                removeOptionalTags: true//移除可选附加标签
            },
            html: {
                files: [
                    {expand: true, cwd: 'dist/html', src: ['*.html'], dest: 'dist/html'}
                ]
            }
        }
    });
    // These plugins provide necessary tasks.
    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-contrib-connect');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-contrib-imagemin');
    grunt.loadNpmTasks('grunt-contrib-qunit');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-filerev');
    grunt.loadNpmTasks('grunt-rev');
    grunt.loadNpmTasks('grunt-usemin');

    grunt.loadNpmTasks('grunt-contrib-htmlmin');
    grunt.loadNpmTasks('grunt-contrib-watch');

    // Default task.
    grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);
    grunt.registerTask('server', ['connect:server', 'watch']);
    grunt.registerTask('build', ['clean', 'copy:html', 'useminPrepare', 'concat', 'uglify', 'cssmin', 'imagemin', 'filerev', 'htmlmin', 'usemin']);
    grunt.registerTask('clear', ['clean']);
    grunt.registerTask('test', ['clean', 'copy', 'concat', 'uglify', 'cssmin', 'imagemin', 'filerev', 'usemin']);
};
